package com.scse.bms.config;

import cn.hutool.core.util.ObjectUtil;
import com.scse.bms.domain.UserVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @Title: LoginInterceptor
 * @Author: 吴赠禹
 * @Date: 2021/2/15 4:11
 * @Version: 1.0
 * @Description: 登录检查
 *                  1、配置好拦截器要拦截哪些请求
 *                  2、把配置放入容器中
 */

@Slf4j
public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 目标方法执行之前
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String url = request.getRequestURI() + "?" +  request.getQueryString();
        log.info("拦截的请求路径是：{}", url);
        request.getSession().setAttribute("url", url);
        log.info("保存的url是：" + url);

        // 登录检查逻辑
        HttpSession session = request.getSession();
        UserVO loginUser = (UserVO) session.getAttribute("loginUser");
        log.info("[preHandle] 登录拦截器：" + loginUser);
        // session中不为空则根据条件
        if (ObjectUtil.isNotNull(loginUser)) {
            log.info("[用户信息] " + loginUser);
            log.info("这第一个大判断，用户非空判断");
            // 如果普通用户并且请求路径包含/admin，则不放行，重新登录（/admin是后台登录接口，这时可以看作是管理员）
            // 这时就需要普通用户登录也连接查询，返回角色名称，参考管理员登录
            if (url.contains("/admin") && loginUser.getRole().equals("用户")) {
                log.info("这里的条件时请求包含/admin且角色为用户, 被拦截（用户没有管理员权限）");
                response.sendRedirect("/admin/login");
                return false;
            }
            // 如果是普通用户不请求/admin则放行
            else  {
                log.info("拦截器：这里的条件是对（请求包含/admin且角色为用户）取反，放行");
                if (request.getSession().getAttribute("url") != null) {
                    log.info("检查到被拦截的url保存在session中，删除该url。");
                    request.getSession().removeAttribute("url");
                }
                return true;
            }
        }
        // loginUser为空的情况
        if (url.startsWith("/admin")) {
            log.info("这是第二个大判断， 请求包含/admin， 被拦截");
            response.sendRedirect("/admin/login");
            return false;
        }
        // 拦截住，跳转到登录页
        request.setAttribute("msg", "请先登录！");
        // 重定向取不出msg，改为转发（注意转发与重定向的区别）
        // response.sendRedirect("/sign_in");
        request.getRequestDispatcher("/login").forward(request, response);
        return false;
    }

    /**
     * 目标方法执行完成以后
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // log.info("postHandle执行{}", modelAndView);
    }

    /**
     * 页面渲染以后
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // log.info("afterCompletion执行异常{}", ex);
    }
}
